#!/bin/bash
#----------HEADER------------------------------------------------------------------+
#Vm9jw6ogcXVlIG1lIGRldSBzYWJlZG9yaWEhCisgRG9uYSBOaWNhIDIxLzA2LzIwMTMgCg==
#
#AUTOR:
# Jefferson Rocha <lrcjefferson@gmail.com>
#
#PROGRAMA:
# Knight
#
#VERSÃO:
# 0.3b
#
#DEPENDENCIAS:
# Geeqie >=1.3
# MC >=4.8.16
#
#DESCRIÇÃO-------------------------------------------------------------------------+
# Knight é um programa que cria e oculta uma pasta no diretorio root,   
# Com várias funcionalidades como se estivese no próprio prompt do bash.
# Knight é totalmente protegido, pessoas "normais" não conseguiram ter acesso,
# a pasta e muito provavelmente não conseguiram entrar no programa.
# È necessário passar por 5 etapas para logar no Knight e ter acesso a está pasta 
# oculta.
# Se uma das etapas falharem o programa não faz login, simples.
#
#MODO-DE-USO-----------------------------------------------------------------------+
# Extraia a pasta do Knight e rode o arquivo "install.knight".
# Ele irá fazer todo processo para instalação do Knight, lembrando que o mesmo
# não é visivel para usuários comuns com UID 1000, o Knight está com permissão 0 e
# Somente o Root tem acesso ao programa!
#
# Outro ponto é que você pode destruir a pasta, também utilizando um comando em
# linha... para destruir a pasta rode: "knight --destruction" ou "knight -d",
# os arquivos contidos na mesma será apagada! por isso cuidado!
# Para saber mais sobre o programa, faça login no Knight e use a opção "help".
#
#LICENÇA-<MIT>---------------------------------------------------------------------+
#  Copyright (c) <2017> <Jefferson Rocha>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#FIXME 
# -[BUG 2606] A pasta localizada na raiz "/" , pode ser acessivel com o 
# usuário root.
#
#
#CHANGELOG:------------------------------------------------------------------------+
# >(0.2beta) - Jefferson Rocha
#  --Retirado opção inline --camouflage
#
# >(0.3beta) - Jefferson Rocha
#  --Inserido opção inline -d abreviatura de --destruction
#  --Adicionado autocomplete no console do knight
#  --Permissão inicial alterada de 0 para 700 para o knight em /usr/bin
#  --Quando a sáida do programa é com (exit ou quit) a pasta principal troca,
# para .room dentro do diretorio /mnt na entrada novamente ao programa,
# a pasta principal volta a ser .rules.d na raiz / enquanto está em execução!
#----------------------------------------------------------------------------------+

#(VÁRIAVEIS DO SCRIPT)----------------------------------------#
#------Chaves (bibibibi) "DEVE ser alterado pelo usuário"
usuario="1"
senha="1"
codinome="darkstar" # uname -n
#------Configurações, (Não alterar esse trecho!)
programa="knight"
diretorio_raiz="/.rules.d"
subpasta="41-knight.rules/.ghost"
diretorio_bin="/usr/bin/knight"
versao="0.3b"
#------Comandos, (Não alterar esse trecho!)
UNAME=$(uname -n)
ROOT=$(echo "EUID")
geeqie_imagem=$(which geeqie 2>&-)
mc_editor=$(which mc 2>&-)
DEBUG=1 #0 Desligado, 1 Ligado [padrao 1 ligado]

#------Funções----------------------------------------#
debug() {  #Adicionar em trechos do código, caso precise ligar o debug.
[[ "$DEBUG" -eq 1 ]] && set -x
}

# Permissão rwx para o #root
chmod 700 /usr/bin/knight

  if [[ $ROOT -ne 0 ]]; then   #Verificação, ROOT
     exit 1
  fi

# Parametros do Knight para rodar em linha
case $1 in
    -d|--destruction)
       if [[ -d "$diretorio_raiz" ]]; then
           shred -n 50 -z -u "$diretorio_raiz/$subpasta/"* #Executo já eras!
            echo "Feito!"
           exit 0
       else
            echo "Falhou..."
           exit 1
       fi
    ;;
 esac

# Conferindo Frase secreta
 read -p $'\033[31;1m A valentia de qualquer soldado só se conhece na guerra \033[m' frase_secreta
 [[ "$frase_secreta" != "$programa" ]] && echo "Nã nã nã!" && exit 1

# quit ou exit no console, descamuflando .room para padrão.
if [[ -d /mnt/.room ]]; then
  mv /mnt/.room $diretorio_raiz
fi
# Pasta não existe? então vamos criar e dar permissão 0.
if [[ ! -d "$diretorio_raiz"/"$subpasta" ]]; then
  mkdir -p "$diretorio_raiz"/"$subpasta" 2>&-
   chmod 0 "$diretorio_raiz" && chmod 0 "$diretorio_raiz"/"$subpasta"
 fi

#(Bloco de login)--------------------------------------------#
func_login(){
 clear
   read -sp "Login: " fazer_login
   read -sp "Password: " fazer_password

# Vasculhando se todas as informações batem...Se uma não bater não roda.
  if [[ "$fazer_login" = "$usuario" ]] && [[ "$fazer_password" = "$senha" ]] && \
    [[ "$UNAME" = "$codinome" ]]; then
      cd /.rules.d/41-knight.rules/.ghost
       clear
  echo -e " =|=======> \033[31;1m Bem vindo ao "$programa" \033[m"
if [[ ! -e "$geeqie_imagem" ]] || [[ ! -e "$mc_editor" ]]; then
      clear
        echo -e "\033[35;1mNão encontrei o 'MC' ou 'Geeqie', no sistema.\n\e[33;1mSaindo...\033[m" 
       sleep 1s
   exit 124
fi
else
     clear
  func_login
fi
}
func_login



#+----------(Comandos Disponiveis no Knight)------------+
#Lista atualizada com todos comandos do knight!
#
# wget
# sftp
# ssh
# mc
# tar
# cat
# cl <-ou-> clear
# rm <-ou-> remove
# ls <-ou-> list
# mv <-ou-> move
# cp <-ou-> copy
# mkdir
# chmod
# cd
# nano
# knight
# pwd
# view
# help
# exit <-ou-> quit
#
#(Bloco, Opções)-----------------------------------------#
while true; do
  read -ep $'\033[31;1m>> \033[m' opcao1 opcao2 opcao3 opcao4
    case $opcao1 in
        mc) mc ;;

        mv | move) mv $opcao2 $opcao3 ;;

        cat) cat $opcao2 $opcao3 $opcao4 ;;

        cp | copy) cp $opcao2 $opcao3 $opcao4 ;;

        tar) tar $opcao2 $opcao3 $opcao4 ;;

        cd) cd $opcao2 ;;

        nano) nano $opcao2 $opcao3 ;;

        knight)
            case $opcao2 in
                 -v | --version) echo "Versão atual é $versao";;
            esac
        ;;

        clear | cl) clear ;;

        chmod) chmod $opcao2 $opcao3 ;;

        mkdir) mkdir $opcao2 $opcao3 ;;

        rm | remove) rm $opcao2 $opcao3 2>&- ;;

        pwd) pwd ;;

        ssh) ssh $opcao2 $opcao3 $opcao4 ;;

        sftp) sftp $opcao2 $opcao3 $opcao4 ;;

        wget) wget $opcao2 $opcao3 $opcao4 ;;

        ls | list) ls --color $opcao2 $opcao3 ;;

        view)
            case $opcao2 in
                 -i | --image) [[ ! -e $opcao3 ]] && echo -e "\033[35;1m '$opcao3' não existe \033[m" || \
                   geeqie $opcao3 ;;

                 -t | --text) mcedit $opcao3 ;;
            esac #case $opcao2
        ;; #view

        help) echo "Ajuda" ;;

        exit | quit) mv $diretorio_raiz /mnt/.room && exit 0 ;; # Camuflagem /mnt/.room

        *) echo -e "\033[35;1m Comando não encontrado \033[m" ;;

    esac #fim_case_$opcao1
done #fim_While_principal
